#!/usr/bin/env node

const zlib = require('zlib');
const fs = require('fs');
const assert = require('assert');//断言
const src = process.argv[2];

// console.log(src);
// 检查是否有命令行参数
if (src === undefined) {
  console.error('错误：未提供要压缩的文件名。');
  process.exit(1);
}

// 检查文件是否存在
if (!fs.existsSync(src)) {
  console.error(`错误：文件 ${src} 不存在。`);
  process.exit(1);
}
assert.notEqual(src, undefined, 'file name can not be null');
const dst = src + '.gz';

// 流的方式
// fs.createReadStream(src).pipe(zlib.createGzip()).pipe(fs.createWriteStream(dst));
// 创建读取流
const readStream = fs.createReadStream(src);

// 创建 GZip 压缩流
const gzip = zlib.createGzip();

// 创建写入流
const writeStream = fs.createWriteStream(dst);

// 将读取流通过压缩流写入写入流
readStream.pipe(gzip).pipe(writeStream);

// 监听流结束事件
writeStream.on('finish', () => {
  console.log(`压缩文件已保存为：${dst}`);
  // 获取压缩前后的文件大小
  const originalSize = fs.statSync(src).size;
  const compressedSize = fs.statSync(dst).size;
  console.log(`压缩前文件大小：${originalSize} 字节`);
  console.log(`压缩后文件大小：${compressedSize} 字节`);
});

// 监听可能发生的错误
readStream.on('error', (error) => {
  console.error(`读取文件错误：${error}`);
});
gzip.on('error', (error) => {
  console.error(`压缩过程错误：${error}`);
});
writeStream.on('error', (error) => {
  console.error(`写入文件错误：${error}`);
});
// buffer方式
const buf = fs.readFileSync(src);
// 使用 GZip 算法压缩文件内容
zlib.gzip(buf, function(err, buffer) {
  assert.ifError(err); // 检查是否有错误
  console.log('未压缩文件大小：%d 字节', buf.length);
  console.log('压缩后文件大小：%d 字节', buffer.length);

  // 将压缩后的数据写入新文件
  fs.writeFileSync(dst, buffer);
  console.log(`压缩文件已保存为：${dst}`);
});
// ./01-my-gzip.js LICENSE
// 将原LICENSE改为LICENSE.bak
// 比较内容和字节数
// 删除rm LICENSE.bak